﻿
namespace Bettzueche.RLLibrary.Types
{
    /// <summary>
    /// Interface für Dimensions-Kombinationen (mit kontinuierlichen Werten), dass zu einem Zustand
    /// die Menge der zugehörigen Merkmal-Indizes gibt.
    /// </summary>
    /// <typeparam name="TState">The type of the state.</typeparam>
    /// <remarks>
    /// Es ist vorgesehen, dass die implementierende Klasse die Kombinationsvariante der Dimensionen
    /// des Zustandsraums (konjunktiv, disjunktiv) umsetzt und entsprechend die Merkmalindizes errechnet.
    /// Bei MultiTiling und disjkunktiver Verknüpfung kann ein Zustand mehrere Merkmale besitzen.
    /// </remarks>
    public interface IFeatures<TState> where TState : IState
    {
        /// <summary>
        /// Gibt die Merkmalsmenge(bzw. die Merkmals- oder Zustandsnummern), die aus den Zustandseigenschaften bspw. mittels 
        /// <c>MultiTiling</c> ermittelt werden.
        /// </summary>
        /// <param name="state">Der Zustand</param>
        /// <returns>IDs (Indizes) der Merkmale, die zu den übergebenen Zustandsdaten gehören.</returns>
        int[] GetFeatureSet(TState state);

        /// <summary>
        /// Optional! Gets the state from features.
        /// </summary>
        /// <param name="features">The features.</param>
        /// <returns></returns>
        TState GetStateFromFeatures(int[] features);
    }
}
